package malagaAcoge.controller.beans;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;

import malagaAcoge.controller.daos.InformacionFamiliarDao;
import malagaAcoge.controller.daos.PerfilLaboralDao;
import malagaAcoge.controller.daos.PerfilLaboralDao;
import malagaAcoge.model.entities.Expediente;
import malagaAcoge.model.entities.Experiencialaboral;
import malagaAcoge.model.entities.Familiar;
import malagaAcoge.model.entities.Formacion;
import malagaAcoge.model.entities.Idioma;
import malagaAcoge.model.entities.Perfillaboral;
import malagaAcoge.model.entities.Tecnico;
import malagaAcoge.model.entities.Usuario;

public class PerfilLaboralBean {
	private Usuario usuarioSelecionado;
	private Tecnico currentTecnico;
	private Perfillaboral perfilLaboral;
	private List<Idioma> idiomas;
	private List<Experiencialaboral> experiencias;
	private List<Formacion> formaciones;
	private Idioma nuevoIdioma;
	private Experiencialaboral nuevaExperiencia;
	private Formacion nuevaFormacion;
	private Idioma idioma;
	private Experiencialaboral experiencia;
	private Formacion formacion;
	private String tipo;
	private String tipo2;
	private Date fechaInExp;
	private Date fechaFinExp;
	private Date fechaInForm;
	private Date fechaFinFor;
	private Perfillaboral currentPerfilLaboral;
	private SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");

	public PerfilLaboralBean() {
		setCurrentTecnico((Tecnico) FacesContext.getCurrentInstance()
				.getExternalContext().getSessionMap().get("tecnico"));
		setUsuarioSelecionado((Usuario) FacesContext.getCurrentInstance()
				.getExternalContext().getSessionMap().get("usuario"));
		perfilLaboral = new Perfillaboral();
		nuevoIdioma = new Idioma();
		nuevaExperiencia = new Experiencialaboral();
		nuevaFormacion = new Formacion();
		idioma = new Idioma();
		experiencia = new Experiencialaboral();
		formacion = new Formacion();
	}

	public void addPerfilLaboral() {
		Expediente expediente = getUsuarioSelecionado().getExpedientes().get(0);
		perfilLaboral.setExpedienteBean(expediente);
		perfilLaboral.setSituacionLaboral(getTipo());
		new PerfilLaboralDao();
		PerfilLaboralDao.createPerfillaboral(perfilLaboral);
		getUsuarioSelecionado().getExpedientes().get(0)
				.setPerfillaborals(new ArrayList<Perfillaboral>());
		getUsuarioSelecionado().getExpedientes().get(0).getPerfillaborals()
				.add(perfilLaboral);
		FacesContext.getCurrentInstance().getExternalContext().getSessionMap()
				.put("usuario", usuarioSelecionado);
		FacesContext context = FacesContext.getCurrentInstance();
		context.addMessage(null, new FacesMessage("Exito",
				"Datos guardados correctamente."));
		FacesContext.getCurrentInstance().getExternalContext().getSessionMap()
				.remove("tipo");
	}

	public void updatePerfilLaboral() {
		perfilLaboral = getUsuarioSelecionado().getExpedientes().get(0)
				.getPerfillaborals().get(0);
		perfilLaboral.setSituacionLaboral(getTipo2());
		if (perfilLaboral.getSituacionLaboral().equals("En paro")) {
			perfilLaboral.setDuracionMeses(0);
			perfilLaboral.setNomina(false);
			perfilLaboral.setSalario(0);
		}
		new PerfilLaboralDao();
		PerfilLaboralDao.updatePerfillaboral(perfilLaboral);
		getUsuarioSelecionado().getExpedientes().get(0).getPerfillaborals()
				.set(0, perfilLaboral);
		FacesContext.getCurrentInstance().getExternalContext().getSessionMap()
				.put("usuario", usuarioSelecionado);
		FacesContext context = FacesContext.getCurrentInstance();
		context.addMessage(null, new FacesMessage("Exito",
				"Datos modificados correctamente."));
		FacesContext.getCurrentInstance().getExternalContext().getSessionMap()
				.remove("tipo2");
		currentPerfilLaboral = null;
	}

	public void eliminarIdioma() {
		idioma = (Idioma) FacesContext.getCurrentInstance()
				.getExternalContext().getSessionMap().remove("idioma");
		perfilLaboral = getUsuarioSelecionado().getExpedientes().get(0)
				.getPerfillaborals().get(0);
		new PerfilLaboralDao();
		PerfilLaboralDao.deleteIdioma(idioma.getIdIdioma());
		perfilLaboral.getIdiomas().remove(idioma);
		getUsuarioSelecionado().getExpedientes().get(0).getPerfillaborals()
				.set(0, perfilLaboral);
		FacesContext.getCurrentInstance().getExternalContext().getSessionMap()
				.put("usuario", usuarioSelecionado);
		FacesContext context = FacesContext.getCurrentInstance();
		context.addMessage(null, new FacesMessage("Exito", "Idioma eliminado."));
		getIdiomas();
	}

	public void addIdioma() {
		perfilLaboral = getUsuarioSelecionado().getExpedientes().get(0)
				.getPerfillaborals().get(0);
		nuevoIdioma.setPerfillaboral(perfilLaboral);
		new PerfilLaboralDao();
		PerfilLaboralDao.createIdioma(nuevoIdioma);
		if (perfilLaboral.getIdiomas() == null) {
			perfilLaboral.setIdiomas(new ArrayList<Idioma>());
		}
		perfilLaboral.getIdiomas().add(nuevoIdioma);
		getUsuarioSelecionado().getExpedientes().get(0).getPerfillaborals()
				.set(0, perfilLaboral);
		FacesContext.getCurrentInstance().getExternalContext().getSessionMap()
				.put("usuario", usuarioSelecionado);
		FacesContext context = FacesContext.getCurrentInstance();
		context.addMessage(null, new FacesMessage("Exito",
				"Datos guardados correctamente."));
		nuevoIdioma = new Idioma();
		getIdiomas();
	}

	public void eliminarExperiencia() {
		experiencia = (Experiencialaboral) FacesContext.getCurrentInstance()
				.getExternalContext().getSessionMap().remove("experiencia");
		perfilLaboral = getUsuarioSelecionado().getExpedientes().get(0)
				.getPerfillaborals().get(0);
		new PerfilLaboralDao();
		PerfilLaboralDao.deleteExperiencia(experiencia
				.getIdExperienciaLaboral());
		perfilLaboral.getExperiencialaborals().remove(experiencia);
		getUsuarioSelecionado().getExpedientes().get(0).getPerfillaborals()
				.set(0, perfilLaboral);
		FacesContext.getCurrentInstance().getExternalContext().getSessionMap()
				.put("usuario", usuarioSelecionado);
		FacesContext context = FacesContext.getCurrentInstance();
		context.addMessage(null, new FacesMessage("Exito",
				"Experiencia eliminada."));
		getExperiencias();
	}

	public void addExperiencia() {
		perfilLaboral = getUsuarioSelecionado().getExpedientes().get(0)
				.getPerfillaborals().get(0);
		nuevaExperiencia.setPerfillaboral(perfilLaboral);
		nuevaExperiencia.setFechaInicio(sdf.format(fechaInExp));
		nuevaExperiencia.setFechaFin(sdf.format(fechaFinExp));
		new PerfilLaboralDao();
		PerfilLaboralDao.createExperiencia(nuevaExperiencia);
		if (perfilLaboral.getExperiencialaborals() == null) {
			perfilLaboral
					.setExperiencialaborals(new ArrayList<Experiencialaboral>());
		}
		perfilLaboral.getExperiencialaborals().add(nuevaExperiencia);
		getUsuarioSelecionado().getExpedientes().get(0).getPerfillaborals()
				.set(0, perfilLaboral);
		FacesContext.getCurrentInstance().getExternalContext().getSessionMap()
				.put("usuario", usuarioSelecionado);
		FacesContext context = FacesContext.getCurrentInstance();
		context.addMessage(null, new FacesMessage("Exito",
				"Datos guardados correctamente."));
		nuevaExperiencia = new Experiencialaboral();
		getExperiencias();
	}

	public void eliminarFormacion() {
		formacion = (Formacion) FacesContext.getCurrentInstance()
				.getExternalContext().getSessionMap().remove("formacion");
		perfilLaboral = getUsuarioSelecionado().getExpedientes().get(0)
				.getPerfillaborals().get(0);
		new PerfilLaboralDao();
		PerfilLaboralDao.deleteFormacion(formacion.getIdFormacion());
		perfilLaboral.getFormacions().remove(formacion);
		getUsuarioSelecionado().getExpedientes().get(0).getPerfillaborals()
				.set(0, perfilLaboral);
		FacesContext.getCurrentInstance().getExternalContext().getSessionMap()
				.put("usuario", usuarioSelecionado);
		FacesContext context = FacesContext.getCurrentInstance();
		context.addMessage(null, new FacesMessage("Exito",
				"Formacion eliminada."));
	}

	public void addFormacion() {
		perfilLaboral = getUsuarioSelecionado().getExpedientes().get(0)
				.getPerfillaborals().get(0);
		nuevaFormacion.setPerfillaboral(perfilLaboral);
		nuevaFormacion.setFechaInicio(sdf.format(fechaInForm));
		nuevaFormacion.setFechaFin(sdf.format(fechaFinFor));
		new PerfilLaboralDao();
		PerfilLaboralDao.createFormacion(nuevaFormacion);
		if (perfilLaboral.getFormacions() == null) {
			perfilLaboral.setFormacions(new ArrayList<Formacion>());
		}
		perfilLaboral.getFormacions().add(nuevaFormacion);
		getUsuarioSelecionado().getExpedientes().get(0).getPerfillaborals()
				.set(0, perfilLaboral);
		FacesContext.getCurrentInstance().getExternalContext().getSessionMap()
				.put("usuario", usuarioSelecionado);
		FacesContext context = FacesContext.getCurrentInstance();
		context.addMessage(null, new FacesMessage("Exito",
				"Datos guardados correctamente."));
		nuevaFormacion = new Formacion();
	}

	public void setUsuarioSelecionado(Usuario usuarioSelecionado) {
		this.usuarioSelecionado = usuarioSelecionado;
	}

	public Usuario getUsuarioSelecionado() {
		usuarioSelecionado = (Usuario) FacesContext.getCurrentInstance()
				.getExternalContext().getSessionMap().get("usuario");
		return usuarioSelecionado;
	}

	public void setCurrentTecnico(Tecnico currentTecnico) {
		this.currentTecnico = currentTecnico;
	}

	public Tecnico getCurrentTecnico() {
		return currentTecnico;
	}

	public void setInformacionFamiliar(Perfillaboral perfilLaboral) {
		this.perfilLaboral = perfilLaboral;
	}

	public Perfillaboral getInformacionFamiliar() {
		return perfilLaboral;
	}

	public void setIdiomas(List<Idioma> idiomas) {
		this.idiomas = idiomas;
	}

	public List<Idioma> getIdiomas() {
		if (getCurrentPerfilLaboral() != null) {
			new PerfilLaboralDao();
			idiomas = PerfilLaboralDao.findIdiomasByperfil(currentPerfilLaboral
					.getIdPerfilLaboral());
		}
		return idiomas;
	}

	public void setExperiencias(List<Experiencialaboral> experiencias) {
		this.experiencias = experiencias;
	}

	public List<Experiencialaboral> getExperiencias() {
		if (getCurrentPerfilLaboral() != null) {
			new PerfilLaboralDao();
			experiencias = PerfilLaboralDao
					.findExperiencialaboralsByperfil(currentPerfilLaboral
							.getIdPerfilLaboral());
		}
		return experiencias;
	}

	public void setFormaciones(List<Formacion> formaciones) {
		this.formaciones = formaciones;
	}

	public List<Formacion> getFormaciones() {
		if (getCurrentPerfilLaboral() != null) {
			new PerfilLaboralDao();
			formaciones = PerfilLaboralDao
					.findFormacionsByperfil(currentPerfilLaboral
							.getIdPerfilLaboral());
		}
		return formaciones;
	}

	public Perfillaboral getPerfilLaboral() {
		return perfilLaboral;
	}

	public void setPerfilLaboral(Perfillaboral perfilLaboral) {
		this.perfilLaboral = perfilLaboral;
	}

	public Idioma getNuevoIdioma() {
		return nuevoIdioma;
	}

	public void setNuevoIdioma(Idioma nuevoIdioma) {
		this.nuevoIdioma = nuevoIdioma;
	}

	public Experiencialaboral getNuevaExperiencia() {
		return nuevaExperiencia;
	}

	public void setNuevaExperiencia(Experiencialaboral nuevaExperiencia) {
		this.nuevaExperiencia = nuevaExperiencia;
	}

	public Formacion getNuevaFormacion() {
		return nuevaFormacion;
	}

	public void setNuevaFormacion(Formacion nuevaFormacion) {
		this.nuevaFormacion = nuevaFormacion;
	}

	public Idioma getIdioma() {
		return idioma;
	}

	public void setIdioma(Idioma idioma) {
		this.idioma = idioma;
		FacesContext.getCurrentInstance().getExternalContext().getSessionMap()
				.put("idioma", idioma);
	}

	public Experiencialaboral getExperiencia() {
		return experiencia;
	}

	public void setExperiencia(Experiencialaboral experiencia) {
		this.experiencia = experiencia;
		FacesContext.getCurrentInstance().getExternalContext().getSessionMap()
				.put("experiencia", experiencia);
	}

	public Formacion getFormacion() {
		return formacion;
	}

	public void setFormacion(Formacion formacion) {
		this.formacion = formacion;
		FacesContext.getCurrentInstance().getExternalContext().getSessionMap()
				.put("formacion", formacion);
	}

	public void setTipo(String tipo) {
		this.tipo = tipo;
		FacesContext.getCurrentInstance().getExternalContext().getSessionMap()
				.put("tipo", tipo);
	}

	public String getTipo() {
		tipo = (String) FacesContext.getCurrentInstance().getExternalContext()
				.getSessionMap().get("tipo");
		return tipo;
	}

	public void setTipo2(String tipo2) {
		this.tipo2 = tipo2;
		FacesContext.getCurrentInstance().getExternalContext().getSessionMap()
				.put("tipo2", tipo2);
	}

	public String getTipo2() {
		tipo2 = (String) FacesContext.getCurrentInstance().getExternalContext()
				.getSessionMap().get("tipo2");
		if (tipo2 == null || tipo2.equals("")) {
			tipo2 = usuarioSelecionado.getExpedientes().get(0)
					.getPerfillaborals().get(0).getSituacionLaboral();
		}
		FacesContext.getCurrentInstance().getExternalContext().getSessionMap()
				.put("tipo2", tipo2);
		return tipo2;
	}

	public Date getFechaInExp() {
		return fechaInExp;
	}

	public void setFechaInExp(Date fechaInExp) {
		this.fechaInExp = fechaInExp;
	}

	public Date getFechaFinExp() {
		return fechaFinExp;
	}

	public void setFechaFinExp(Date fechaFinExp) {
		this.fechaFinExp = fechaFinExp;
	}

	public Date getFechaInForm() {
		return fechaInForm;
	}

	public void setFechaInForm(Date fechaInForm) {
		this.fechaInForm = fechaInForm;
	}

	public Date getFechaFinFor() {
		return fechaFinFor;
	}

	public void setFechaFinFor(Date fechaFinFor) {
		this.fechaFinFor = fechaFinFor;
	}

	public void valorElegido() {
		if (tipo != null && !tipo.equals("")) {
			FacesContext.getCurrentInstance().getExternalContext()
					.getSessionMap().put("tipo", tipo);
		}
	}

	public void valorElegido2() {
		if (tipo2 != null && !tipo2.equals("")) {
			FacesContext.getCurrentInstance().getExternalContext()
					.getSessionMap().put("tipo2", tipo2);
		}
	}

	public void setCurrentPerfilLaboral(Perfillaboral currentPerfilLaboral) {
		this.currentPerfilLaboral = currentPerfilLaboral;
	}

	public Perfillaboral getCurrentPerfilLaboral() {
		if (currentPerfilLaboral == null
				&& getUsuarioSelecionado().getExpedientes() != null
				&& !getUsuarioSelecionado().getExpedientes().isEmpty()) {
			new PerfilLaboralDao();
			currentPerfilLaboral = PerfilLaboralDao
					.findPerfilByExpediente(getUsuarioSelecionado()
							.getExpedientes().get(0).getIdExpediente());
		}
		return currentPerfilLaboral;
	}
}
